"""字符串的创建"""

"""
    创建字符串的两种方式：
    一、使用引号
创建字符串时既可以使用单引号,也可以使用双引号,通常使用单引号。
"""
def chuangjian():
    a = 'abcd'
    print(a)
# chuangjian()

"""
一、使用转义字符表示无法直接表示的特殊字符
    当字符串中包含换行、回车、水平制表符或退格等无法直接表示的特殊字符时,该如何表示呢?
    换行:newline,光标移动到下一行的开头
    回车:return,光标移动到本行的开头
    水平制表符:键盘上的tab键,光标移动到下一组4个空格的开始处
    退格:键盘上backspace键,回退一个字符
    
    可以使用如下转义字符:
    换行:\n
    回车:\r
    水平制表符:\t
    退格:\b
"""
#转义字符
def zhuanyi():
    print('abc\ndef')
    print('abc\rdef') # def
    print('123456\t1234\t45') # 123456	1234	45
    print('123\b456') # 12456

    print('abc\\rdef')
    print('abc\'rdef\'')
# zhuanyi()

"""如果不想让字符串中的转义字符生效,可以在字符串的前面添加r或R,从而将字符串声明为原始字符串。"""
#原始字符串
def yuanshi():
    print(r'\tC:\\Program Files') # \tC:\\Program Files
    print(R'\tC:\\Program Files') # \tC:\\Program Files

    """
    原始字符串的最后一个字符不能是反斜杠(最后两个字符都是反斜杠除外)。
    """
    # print(r'HelloWorld\')

    print(r'HelloWorld\\')
    # 解释器不会把r'What\'看做是一个原始字符串,因为原始于字符串不能以反斜杠结尾
    print(r'What\'s your name')
    # 解释器会把r'What\\'看做是一个原始字符串,因为原始字符串可以以两个反斜杠结尾
    # print(r'What\\'s your name')
# yuanshi()

"""
多行字符串
"""
"""
如果想让字符串跨越多行,常见的方式有两种:
"""
def duohang():
    #一、使用三个引号
    print("""
这是一个跨越多行
的字'符'串
    """)
    #末尾使用反斜杠'\'
    print("123\
asd\
456"
          )
# duohang()

"""
字符串的加法和乘法使用
"""
def add_mul():
    print('Hello' + 'World')
    # 把多个字符串常量放在一起就会自动连接然后生成一个新字符串。
    s = 'Hello'',''WORLD'
    print(s)
    s = 'Hello'','\
        'WORLD'\
        '!'
    print(s)

    # 二、使用乘法运算符操作字符串
    print('Hello' * 3)

# add_mul()

"""字符串的查操作"""

"""
因为字符串可以看做是字符的列表,所以字符串与列表的"查查"操作是类似的,区别在于:
当获得字符串中指定子串的索引时,除了调用方法index,还可以调用方法find、rfind、rindex。
其中,子串的索引指的是子串中第一个字符的索引。
"""
def strcha():
    s = '12345623789'
    print(s.index('23'))
    print(s.find('23'))

    print(s.rindex('23'))
    print(s.rfind('23'))

    #子串不存在时
    # print(s.index('45',1,4)) # ValueError: substring not found
    # print(s.rindex('45',1,4)) # ValueError: substring not found

    print(s.find('45',1,4)) # -1
    print(s.rfind('45',1,4)) # -1

# strcha()


"""字符串是不可变类型"""
"""字符串没有"改"操作、"增"操作和"删"操作,因为字符串是是不可变类型。"""
def str_modfiy():
    s = 'Hello,World'
    s1 = s[:5] + '!' +s[6:]
    print(s1)
# str_modfiy()


""""使用比较运算符比较两个字符串"""
"""除了使用比较运算符对两个列表或元组进行比较,还可以使用如下比较运算符对两个字符串进行比较:
比较规则为:首先比较两个字符串中的第一个字符,如果相等则继续比较下一个字符,依次比较下去,
直到两个字符串中的字符不相等时其比较结果就是两个字符串的比较结果,两个字符串中的所有后续字符
将不再被比较。
两个字符进行比较时,比较的是其ordinal value。调用内置函数ord可以得到指定字符的
ordinal value。与内置函数ord对应的是内置函数chr,调用内置函数chr时指定ordinal value
可以得到其对应的字符。
"""

def str_cpmp():
    print((ord('a')))   #97
    print((chr(97)))    #a

    print((ord('b')))   #98
    print((chr(98)))    #b

    print((ord('A')))   #65
    print((chr(65)))    #A

    """
    is 和 == 的区别，== 是否相等 ，is "同一性"
    """

    a = b = "Hello"
    c = 'Hello'

    print(a == b) #True
    print(a == c) #True

    print(a is b) #True
    print(a is c) #True

# str_cpmp()

"""字符串反转"""
def str_rev ():
    s = '12345'
    itrerattoe = reversed(s)
    print(itrerattoe) #<reversed object at 0x000001ADB5967FD0>
    print(list(itrerattoe)) #['5', '4', '3', '2', '1']
# str_rev()

"""字符串排序"""
def str_sort():
    s = 'SDKLsksd'
    print(sorted(s)) #['D', 'K', 'L', 'S', 'd', 'k', 's', 's']
    print(sorted(s,reverse=True)) #['s', 's', 'k', 'd', 'S', 'L', 'K', 'D']
    """
    调用内置函数sorted时,还可以指定参数key=函数名或 key=类名.方法名,
    这样会对字符串中的所有字符分别调用指定的函数或方法,然后按安照函数或方法的返回值进行排序,
    从而自定义排序规则。
    """
    print(sorted(s, key=str.lower)) #['D', 'd', 'K', 'k', 'L', 'S', 's', 's']

    L = ['Python', 'java', 'Switf']

    print(sorted(L, key=len))  #['java', 'Switf', 'Python']
    print(sorted(L, key=str.lower)) #['java', 'Python', 'Switf']
    """调用列表的方法sort时，也可以指定参数key"""
    L = ['Python', 'java', 'Switf']

    L.sort(key=len)
    print(L) #['java', 'Switf', 'Python']
    L.sort(key=str.lower) #['java', 'Switf', 'Python']
# str_sort()

"""格式化字符串 % """

def str_format():
    # %
    name = "Alice"
    age = 30
    print("Name: %s, Age: %d" % (name, age))
    # .format()
    print("Name:{0}, Age:{1}".format(name,age))

    #{}
    print(f"Name:{name},Age:{age}")
# str_format()



"""字符串对齐"""
"""如果想要设置字符串的对齐方式,可以调用字符串的以下方法:
1.center:中心对齐
2.ljust:左对齐
3.rjust:右对齐
这三个方法都可以接收两个参数,其中,
第1个参数指定字符串的宽度。
"""

def str_duiqi():
    print('HelloWorld'.center(18, "*"))  #****HelloWorld****
    print('HelloWorld'.center(18))                      #    HelloWorld
    print('HelloWorld'.center(8))                       #HelloWorld


    print('HelloWorld'.ljust(18, "*"))  #HelloWorld********
    print('HelloWorld'.ljust(18))                      #HelloWorld
    print('HelloWorld'.ljust(8))                       #HelloWorld

    print('HelloWorld'.rjust(18, "*"))  #********HelloWorld
    print('HelloWorld'.rjust(18))                      #        HelloWorld
    print('HelloWorld'.rjust(8))                       #HelloWorld

    print('57'.zfill(6))                               #000057
str_duiqi()


if __name__ == '__main__':
    print()
